home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d998.lha / TeXPrt / source / IO.c < prev    next >
C/C++ Source or Header  |  1994-04-05  |  21KB  |  436 lines

  1. /***************************************************************************
  2.  *                                                                         *
  3.  *  Filename : IO.c                                                        *
  4.  *                                                                         *
  5.  *  Description : Input and output routines for the TeXPrt program.        *
  6.  *                                                                         *
  7.  ***************************************************************************
  8.  *                                                                         *
  9.  *                         Modification History                            *
  10.  *                                                                         *
  11.  *  Date      Author       Comments                                        *
  12.  * ----------------------------------------------------------------------  *
  13.  * 10.6.93    R.Bödi       Created.                                        *
  14.  * 2.11.93    R.Bödi       Changed structure TeXDriver, see TeXPrt.h       *
  15.  * 22.2.94    R.Bödi       Changed due to modifications in TeXPrt.h        *
  16.  *  2.3.94    R.Bödi       Added tags DVIFile and Misc to structures       *
  17.  *                         RawSettings and ParsedSettings.                 *
  18.  *  7.3.94    R.Bödi       Added tracking of the parsing process of a      *
  19.  *                         driver spec file.                               *
  20.  *                                                                         *
  21.  ***************************************************************************
  22.  *                                                                         *
  23.  * Copyright © 1993-1994 Richard Bödi,  All rights reserved.               *
  24.  *                                                                         *
  25.  ***************************************************************************/
  26.  
  27. /*----------------------------- INCLUDES ----------------------------------*/
  28.  
  29. #include "TeXPrt.h"
  30. #include "TexPrt_protos.h"
  31. #include "TexPrt_globals.h"
  32.  
  33. /*----------------------------- DEFINES -----------------------------------*/
  34.  
  35. #define SETASSIGNS   TotalAssigns += Assigns; if (Assigns) Line++;
  36.  
  37. /*------------------------------- CODE ------------------------------------*/
  38.  
  39.  
  40. /***************************************************************************
  41.  *                                                                         *
  42.  *  Function name : ScanDrivers                                            *
  43.  *                                                                         *
  44.  *  Description : Scans the directory given by DriverDrawer for DVI        *
  45.  *                printer driver spec files.                               *
  46.  *                                                                         *
  47.  ***************************************************************************
  48.  *                                                                         *
  49.  *  Synopsis : ScanDrivers (AvailDrivers)                                  *
  50.  *                                                                         *
  51.  *  Parameters :                                                           *
  52.  *       (struct AvailDrivers*) AvailDrivers :                             *
  53.  *          Fills the AvailDrivers structure with the names and the        *
  54.  *          filenames of the drivers found in the DriverDrawer directory.  *
  55.  *          The strings are limited to NAMELENGTH  characters.             *
  56.  *                                                                         *
  57.  *  Return value : (short)                                                 *
  58.  *       >= 0 : Number of Driver spec files found in the Drawer            *
  59.  *        < 0 : DOS error or no memory.                                    *
  60.  *                                                                         *
  61.  ***************************************************************************/
  62.  
  63. short ScanDrivers (struct AvailDrivers *AvailDrivers)
  64.  
  65. {
  66. struct FileInfoBlock    FInfo;
  67. BPTR                    DriverLock, OldLock, File;
  68. short                   No = 0;
  69. char                    Buffer[BUFFERLENGTH];
  70. FILE                   *fp;
  71.  
  72. if (DriverLock = Lock (DriverDrawer, ACCESS_READ))
  73.    {
  74.    OldLock = CurrentDir (DriverLock);
  75.  
  76.    if (Examine (DriverLock, &FInfo))
  77.       do {
  78.          if (FInfo.fib_DirEntryType < 0)
  79.             {
  80.             if (File = Open (FInfo.fib_FileName, MODE_OLDFILE))
  81.                {
  82.                Read (File, Buffer, strlen (DriverLogo));
  83.                if (!strncmp (Buffer, DriverLogo, strlen (DriverLogo)))
  84.                   No++;
  85.               Close (File);
  86.               }
  87.             }
  88.          } while (ExNext (DriverLock, &FInfo));
  89.  
  90.    if (No > 0)
  91.       if (AvailDrivers->DriverFiles = calloc (No, NAMELENGTH * 2))
  92.          {
  93.          AvailDrivers->DriverNames = AvailDrivers->DriverFiles + No * NAMELENGTH;
  94.          No = 0;
  95.  
  96.          if (Examine (DriverLock, &FInfo))
  97.             do {
  98.                if (FInfo.fib_DirEntryType < 0)
  99.                   {
  100.                   if (File = Open (FInfo.fib_FileName, MODE_OLDFILE))
  101.                      {
  102.                      Read (File, Buffer, strlen (DriverLogo));
  103.                      if (!strncmp (Buffer, DriverLogo, strlen (DriverLogo)))
  104.                         {
  105.                         strncpy (AvailDrivers->DriverFiles + No * NAMELENGTH, FInfo.fib_FileName, NAMELENGTH);
  106.                         if (fp = fopen (FInfo.fib_FileName, "r"))
  107.                            {
  108.                            strcpy (Buffer, DriverLogo);
  109.                            strcat (Buffer, " \n Name ; %31s \n");
  110.                            fscanf (fp, Buffer, AvailDrivers->DriverNames + No * NAMELENGTH);
  111.                            fclose (fp);
  112.                            No++;
  113.                            }
  114.                         }
  115.                      Close (File);
  116.                      }
  117.                   }
  118.                } while (ExNext (DriverLock, &FInfo));
  119.          }
  120.       else
  121.          No = -1;
  122.  
  123.    CurrentDir (OldLock);
  124.    UnLock (DriverLock);
  125.    }
  126.  
  127. return (No);
  128. }
  129.  
  130.  
  131. /***************************************************************************
  132.  *                                                                         *
  133.  *  Function name : LoadDriverSpec                                         *
  134.  *                                                                         *
  135.  *  Description : Loads the data of a printer driver spec file and stores  *
  136.  *                in the TeXDriver structure.                              *
  137.  *                                                                         *
  138.  ***************************************************************************
  139. m *                                                                        *
  140.  *  Synopsis : LoadDriverSpec (Structures, DriverNo)                       *
  141.  *                                                                         *
  142.  *  Parameters :                                                           *
  143.  *       (struct StructPointers *) Structures:                             *
  144.  *          Contains pointers to various data pools.                       *
  145.  *       (USHORT) DriverNo :                                               *
  146.  *          Contains the actual number of the driver as displayed in the   *
  147.  *          Driver menu.                                                   *
  148.  *                                                                         *
  149.  *  Return value : (USHORT)                                                *
  150.  *       0, if printer driver spec file was read successfully.             *
  151.  *      >0, number of last read line.                                      *
  152.  *    1000, no memory, no file, no lock on drawer.                         *
  153.  *                                                                         *
  154.  ***************************************************************************/
  155.  
  156. USHORT LoadDriverSpec (struct StructPointers *Structures, USHORT DriverNo)
  157.  
  158. {
  159. int                     Assigns = 0, TotalAssigns = 0, OptionCount;
  160. USHORT                  Line = 1000;
  161. char                    Buffer[BUFFERLENGTH], OptionStrg[NAMELENGTH];
  162. char                   *Token;
  163. BPTR                    DriverLock, OldLock;
  164. FILE                   *fp;
  165. struct TeXDriver        TempDriver;
  166. struct RawSettings     *TempRaw;
  167. struct DefaultSettings  TempDefault;
  168.  
  169. const                   NoOfAssigns = 54;
  170.  
  171. if (TempRaw = calloc (1, sizeof (struct RawSettings)))
  172.    {
  173.    if (DriverLock = Lock (DriverDrawer, ACCESS_READ))
  174.       {
  175.       OldLock = CurrentDir (DriverLock);
  176.  
  177.       if (fp = fopen (Structures->AvailDrivers->DriverFiles + DriverNo * NAMELENGTH, "r"))
  178.          {
  179.          Line = 1;
  180.          strcpy (Buffer, DriverLogo);
  181.          strcat (Buffer, " \n Name ; %31s \n");
  182.          Assigns = fscanf (fp, Buffer, TempDriver.DriverName);
  183.          SETASSIGNS;
  184.  
  185.          strcpy (Buffer, " \n Node ; %256s \n");
  186.          Assigns = fscanf (fp, Buffer, TempDriver.ProgramNode);
  187.          SETASSIGNS;
  188.  
  189.          Assigns = fscanf (fp, "PageSel (DOCUMENT/FROMTO) ; %80s ", Buffer);
  190.          if (!strcmp (Buffer, "DOCUMENT")) TempDefault.PageSel = DOCUMENT;
  191.          if (!strcmp (Buffer, "FROMTO"))   TempDefault.PageSel = FROMTO;
  192.          Assigns += fscanf (fp, " ; %63s \n", TempRaw->PageSel);
  193.          SETASSIGNS;
  194.  
  195.          Assigns = fscanf (fp, "Copies ; %80s ", Buffer);
  196.          TempDefault.Copies = (unsigned long) atol (Buffer);
  197.          Assigns += fscanf (fp, " ; %63s \n", TempRaw->Copies);
  198.          SETASSIGNS;
  199.  
  200.          Assigns = fscanf (fp, "PageType (ALL/ODD/EVEN) ; %80s ", Buffer);
  201.          if (!strcmp (Buffer, "ALL")) TempDefault.PageType = ALL;
  202.          if (!strcmp (Buffer, "ODD")) TempDefault.PageType = ODD;
  203.          if (!strcmp (Buffer, "EVEN")) TempDefault.PageType = EVEN;
  204.          Assigns += fscanf (fp, " ; %63s \n", TempRaw->PageType);
  205.          SETASSIGNS;
  206.  
  207.          Assigns = fscanf (fp, "Orientation (PORTRAIT/LANDSCAPE) ; %80s ", Buffer);
  208.          if (!strcmp (Buffer, "PORTRAIT")) TempDefault.Orientation = PORTRAIT;
  209.          if (!strcmp (Buffer, "LANDSCAPE")) TempDefault.Orientation = LANDSCAPE;
  210.          Assigns += fscanf (fp, " ; %63s \n", TempRaw->Orientation);
  211.          SETASSIGNS;
  212.  
  213.          Assigns = fscanf (fp, "HOffset ; %80s ", Buffer);
  214.          TempDefault.HOffset = atol (Buffer);
  215.          Assigns += fscanf (fp, " ; %63s ; %63s ; %63s \n", TempRaw->HOffset, TempRaw->HOffsetUnit, TempRaw->HOffsetTxt);
  216.          SETASSIGNS;
  217.  
  218.          Assigns = fscanf (fp, "VOffset ; %80s ", Buffer);
  219.          TempDefault.VOffset = atol (Buffer);
  220.          Assigns += fscanf (fp, " ; %63s ; %63s ; %63s \n", TempRaw->VOffset, TempRaw->VOffsetUnit, TempRaw->VOffsetTxt);
  221.          SETASSIGNS;
  222.  
  223.          Assigns = fscanf (fp, "AdjHOffset ; %80s ", Buffer);
  224.          TempDefault.AdjHOffset = atol (Buffer);
  225.          SETASSIGNS;
  226.  
  227.          Assigns = fscanf (fp, "AdjVOffset ; %80s ", Buffer);
  228.          TempDefault.AdjVOffset = atol (Buffer);
  229.          SETASSIGNS;
  230.  
  231.          for (OptionCount = 0; OptionCount < OPTIONS; OptionCount++)
  232.             {
  233.             sprintf (OptionStrg, "Option%d (ON/OFF) ; %%80s ", OptionCount + 1);
  234.             Assigns = fscanf (fp, OptionStrg, Buffer);
  235.             if (!strcmp (Buffer, "ON"))  TempDefault.Option[OptionCount] = TRUE;
  236.             if (!strcmp (Buffer, "OFF")) TempDefault.Option[OptionCount] = FALSE;
  237.             Assigns += fscanf (fp, " ; %63s ; %63s \n", TempRaw->Option[OptionCount], TempRaw->OptionTxt[OptionCount]);
  238.             SETASSIGNS;
  239.             }
  240.  
  241.          Assigns = fscanf (fp, "Device ; %63s ; %63s", TempDefault.DeviceName, TempRaw->Device);
  242.          SETASSIGNS;
  243.          Assigns = fscanf (fp, "DVIFile ; %63s", TempRaw->DVIFile);
  244.          SETASSIGNS;
  245.          Assigns = fscanf (fp, "Misc ; %63s", TempRaw->Misc);
  246.          SETASSIGNS;
  247.  
  248.          fclose (fp);
  249.          }
  250.  
  251.       CurrentDir (OldLock);
  252.       UnLock (DriverLock);
  253.       }
  254.    }
  255.  
  256. if (TotalAssigns == NoOfAssigns)
  257.    {
  258.    // copy temporal structures to function parameters
  259.    memcpy (Structures->TeXDriver, &TempDriver, sizeof (struct TeXDriver));
  260.    memcpy (Structures->DefaultSettings, &TempDefault, sizeof (struct DefaultSettings));
  261.    memcpy (Structures->RawSettings, TempRaw, sizeof (struct RawSettings));
  262.  
  263.    Token = stptok (TempRaw->PageSel, Structures->ParsedSettings->From, sizeof (Structures->ParsedSettings->From), ",");
  264.    Token = stptok (++Token, Structures->ParsedSettings->To, sizeof (Structures->ParsedSettings->To), ",");
  265.    stptok (++Token, Structures->ParsedSettings->NoOfPages, sizeof (Structures->ParsedSettings->NoOfPages), ",");
  266.  
  267.    stpcpy (Structures->ParsedSettings->Copies, TempRaw->Copies);
  268.  
  269.    Token = stptok (TempRaw->PageType, Structures->ParsedSettings->AllPages, sizeof (Structures->ParsedSettings->AllPages), ",");
  270.    Token = stptok (++Token, Structures->ParsedSettings->OddPages, sizeof (Structures->ParsedSettings->OddPages), ",");
  271.    stptok (++Token, Structures->ParsedSettings->EvenPages, sizeof (Structures->ParsedSettings->EvenPages), ",");
  272.  
  273.    Token = stptok (TempRaw->Orientation, Structures->ParsedSettings->Portrait, sizeof (Structures->ParsedSettings->Portrait), ",");
  274.    stptok (++Token, Structures->ParsedSettings->LandScape, sizeof (Structures->ParsedSettings->LandScape), ",");
  275.  
  276.    stpcpy (Structures->ParsedSettings->HOffset, TempRaw->HOffset);
  277.    stpcpy (Structures->ParsedSettings->HOffsetUnit, TempRaw->HOffsetUnit);
  278.    stpcpy (Structures->ParsedSettings->HOffsetTxt, TempRaw->HOffsetTxt);
  279.    stpcpy (Structures->ParsedSettings->VOffset, TempRaw->VOffset);
  280.    stpcpy (Structures->ParsedSettings->VOffsetUnit, TempRaw->VOffsetUnit);
  281.    stpcpy (Structures->ParsedSettings->VOffsetTxt, TempRaw->VOffsetTxt);
  282.  
  283.    for (OptionCount = 0; OptionCount < OPTIONS; OptionCount++)
  284.       {
  285.       stpcpy (Structures->ParsedSettings->Option[OptionCount], TempRaw->Option[OptionCount]);
  286.       stpcpy (Structures->ParsedSettings->OptionTxt[OptionCount], TempRaw->OptionTxt[OptionCount]);
  287.       }
  288.  
  289.    stpcpy (Structures->ParsedSettings->Device, TempRaw->Device);
  290.    stpcpy (Structures->ParsedSettings->DVIFile, TempRaw->DVIFile);
  291.    stpcpy (Structures->ParsedSettings->Misc, TempRaw->Misc);
  292.  
  293.    repchrstr (Structures->ParsedSettings->From, '"', ' ');
  294.    repchrstr (Structures->ParsedSettings->To, '"', ' ');
  295.    repchrstr (Structures->ParsedSettings->NoOfPages, '"', ' ');
  296.    repchrstr (Structures->ParsedSettings->Copies, '"', ' ');
  297.    repchrstr (Structures->ParsedSettings->AllPages, '"', ' ');
  298.    repchrstr (Structures->ParsedSettings->OddPages, '"', ' ');
  299.    repchrstr (Structures->ParsedSettings->EvenPages, '"', ' ');
  300.    repchrstr (Structures->ParsedSettings->HOffset, '"', ' ');
  301.    repchrstr (Structures->ParsedSettings->VOffset, '"', ' ');
  302.    repchrstr (Structures->ParsedSettings->HOffsetTxt, '"', ' ');
  303.    repchrstr (Structures->ParsedSettings->VOffsetTxt, '"', ' ');
  304.    repchrstr (Structures->ParsedSettings->Portrait, '"', ' ');
  305.    repchrstr (Structures->ParsedSettings->LandScape, '"', ' ');
  306.    repchrstr (Structures->ParsedSettings->Device, '"', ' ');
  307.    repchrstr (Structures->ParsedSettings->DVIFile, '"', ' ');
  308.    repchrstr (Structures->ParsedSettings->Misc, '"', ' ');
  309.    repchrstr (Structures->DefaultSettings->DeviceName, '"', ' ');
  310.  
  311.    for (OptionCount = 0; OptionCount < OPTIONS; OptionCount++)
  312.       {
  313.       repchrstr (Structures->ParsedSettings->Option[OptionCount], '"', ' ');
  314.       repchrstr (Structures->ParsedSettings->OptionTxt[OptionCount], '"', ' ');
  315.       }
  316.  
  317.    Structures->DriverNumber = DriverNo;
  318.    free (TempRaw);
  319.    return (0);
  320.    }
  321. else
  322.    {
  323. // Restore the selected menu item pointer in the Drivers menu
  324.     DoMethod (Structures->MUIPointers->app, MUIM_Application_SetMenuCheck, ID_DRIVER + DriverNo, FALSE);
  325.     DoMethod (Structures->MUIPointers->app, MUIM_Application_SetMenuCheck, ID_DRIVER + Structures->DriverNumber, TRUE);
  326.    return (Line);
  327.    }
  328. }
  329.  
  330.  
  331.  
  332. /***************************************************************************
  333.  *                                                                         *
  334.  *  Function name : SaveDriverSpec                                         *
  335.  *                                                                         *
  336.  *  Description : Restores the data of a printer driver spec file.         *
  337.  *                                                                         *
  338.  ***************************************************************************
  339.  *                                                                         *
  340.  *  Synopsis : SaveDriverSpec (DriverNo, Driver, Raw, Default, Pointers)   *
  341.  *                                                                         *
  342.  *  Parameters :                                                           *
  343.  *    (char *) SpecFilename:                                               *
  344.  *       The name of the driver spec file.                                 *
  345.  *    (struct TeXDriver *) Driver:                                         *
  346.  *       The name and the node of the printer driver.                      *
  347.  *    (struct RawSettings *) Raw:                                          *
  348.  *       Contains the switches for the command line options.               *
  349.  *    (struct DefaultSettings *) Default:                                  *
  350.  *       Contains AdjHOffset and AdjVOffset tags.                          *
  351.  *    (struct MUIPointers *) Pointers:                                     *
  352.  *       A structure consisting of APTRs to MUI elements.                  *
  353.  *                                                                         *
  354.  *  Return value : (BOOL)                                                  *
  355.  *       TRUE, if printer driver spec file was written successfully.       *
  356.  *      FALSE, if not.                                                     *
  357.  *                                                                         *
  358.  ***************************************************************************/
  359.  
  360. BOOL SaveDriverSpec (char *SpecFilename, struct TeXDriver *Driver, struct RawSettings *Raw,
  361.                      struct DefaultSettings *Default, struct MUIPointers *Pointers)
  362.  
  363. {
  364. ULONG             GetInt;
  365. int               OptionCount;
  366. BOOL              NoError = FALSE;
  367. BPTR              DriverLock, OldLock;
  368. FILE             *fp;
  369.  
  370. if (DriverLock = Lock (DriverDrawer, ACCESS_READ))
  371.    {
  372.    OldLock = CurrentDir (DriverLock);
  373.  
  374.    if (fp = fopen (SpecFilename, "w"))
  375.       {
  376.       fprintf (fp, "%s\n", DriverLogo);
  377.       fprintf (fp, "Name ; %s\n", Driver->DriverName);
  378.       fprintf (fp, "Node ; %s\n", Driver->ProgramNode);
  379.  
  380.       fprintf (fp, "PageSel (DOCUMENT/FROMTO) ; ");
  381.       GetAttr (MUIA_Radio_Active, Pointers->RAD_FromTo, &GetInt);
  382.       if (GetInt == DOCUMENT) fprintf (fp, "DOCUMENT ");
  383.       else                    fprintf (fp, "FROMTO ");
  384.       fprintf (fp, "; %s\n", Raw->PageSel);
  385.  
  386.       GetAttr (MUIA_String_Contents, Pointers->STR_Copies, &GetInt);
  387.       fprintf (fp, "Copies ; %s ; %s\n", (char *)GetInt, Raw->Copies);
  388.  
  389.       fprintf (fp, "PageType (ALL/ODD/EVEN) ; ");
  390.       GetAttr (MUIA_Radio_Active, Pointers->RAD_OddEven, &GetInt);
  391.       if (GetInt == ALL)   fprintf (fp, "ALL ");
  392.       if (GetInt == ODD)   fprintf (fp, "ODD ");
  393.       if (GetInt == EVEN)  fprintf (fp, "EVEN ");
  394.       fprintf (fp, "; %s\n", Raw->PageType);
  395.  
  396.       fprintf (fp, "Orientation (PORTRAIT/LANDSCAPE) ; ");
  397.       GetAttr (MUIA_Radio_Active, Pointers->RAD_Orientation, &GetInt);
  398.       if (GetInt == PORTRAIT) fprintf (fp, "PORTRAIT ");
  399.       else                    fprintf (fp, "LANDSCAPE ");
  400.       fprintf (fp, "; %s\n", Raw->Orientation);
  401.  
  402.       GetAttr (MUIA_String_Contents, Pointers->STR_X, &GetInt);
  403.       fprintf (fp, "HOffset ; %s ; %s ; %s ; %s\n", (char *)GetInt, Raw->HOffset, Raw->HOffsetUnit, Raw->HOffsetTxt);
  404.       GetAttr (MUIA_String_Contents, Pointers->STR_Y, &GetInt);
  405.       fprintf (fp, "VOffset ; %s ; %s ; %s ; %s\n", (char *)GetInt, Raw->VOffset, Raw->VOffsetUnit, Raw->VOffsetTxt);
  406.       fprintf (fp, "AdjHOffset ; %d\n", Default->AdjHOffset);
  407.       fprintf (fp, "AdjVOffset ; %d\n", Default->AdjVOffset);
  408.  
  409.       for (OptionCount = 0; OptionCount < OPTIONS; OptionCount++)
  410.          {
  411.          fprintf (fp, "Option%d (ON/OFF) ; ", OptionCount+1);
  412.          GetAttr (MUIA_Selected, Pointers->CHM_Option[OptionCount], &GetInt);
  413.          if (GetInt == FALSE) fprintf (fp, "OFF ");
  414.          else                 fprintf (fp, "ON ");
  415.          fprintf (fp, "; %s ; %s\n", Raw->Option[OptionCount], Raw->OptionTxt[OptionCount]);
  416.          }
  417.  
  418.       GetAttr (MUIA_String_Contents, Pointers->STR_OutFile, &GetInt);
  419.       fprintf (fp, "Device ; %s ; %s\n", (char *)GetInt, Raw->Device);
  420.       fprintf (fp, "DVIFile ; %s\n", Raw->DVIFile);
  421.       fprintf (fp, "Misc ; %s\n", Raw->Misc);
  422.  
  423.       fclose (fp);
  424.       }
  425.  
  426.    CurrentDir (OldLock);
  427.    UnLock (DriverLock);
  428.    NoError = TRUE;
  429.    }
  430.  
  431. return (NoError);
  432. }
  433.  
  434.  
  435. /*---------------------------- END OF FILE --------------------------------*/
  436.